package com.vic.reg;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 正则测试
 * @author victor
 */
public class RegTest {

    public static void main(String[] args) {

        test6();

//        test5();

//        test4();

//        test3();
        
//        test2();

//        test1();

    }


    /**
     * 判断是否包含连续重复的字母（a-zA-Z）
     */
    private static void test6() {

        List<String> list = new ArrayList<>();
        list.add("rattler");
        list.add("ab.cd,,ccce.fs");
        list.add("ra11ler");

        Pattern pattern = Pattern.compile("([a-zA-Z])\\1");
        for (String e : list) {

            Matcher matcher = pattern.matcher(e);
            while (matcher.find()) {
                String g0 = matcher.group(0);
                System.out.println("元素:" + e + ", group0:" + g0);
            }

        }
        /*
        元素:rattler, group0:tt
        元素:ab.cd,,ccce.fs, group0:cc
         */

    }
    /**
     * find 与 matches
     */
    private static void test5() {
        // 匹配连续重复的,或.
        String regex = "(\\.|,)\\1+";
        String str = "ab.cd,,cce.fs";

        Pattern p = Pattern.compile(regex);
        Matcher matcher = p.matcher(str);

        System.out.println(matcher.find()); //true 是否找到
        System.out.println(matcher.matches()); //false 是否匹配
    }

    /**
     * 字符串中连续相同的字符
     */
    private static void test4() {

        List<String> list = new ArrayList<>();
        list.add("111234445466");
        list.add("ab.cd,,cce.fs");
        list.add("ab..cdd,,e.fs");
        list.add("abd,,e..fs");

        String c1Str = "(\\.|,)\\1+";

        Pattern pattern = Pattern.compile(c1Str);
        for (String e : list) {

            Matcher matcher = pattern.matcher(e);
            while (matcher.find()) {
                String g0 = matcher.group(0);
                System.out.println("元素:" + e + ", group0:" + g0);
            }

        }
    }

    /**
     * find() 函数找到匹配的子串
     */
    private static void test3() {
        // 使用字符串模拟从网络上得到的网页源码
        String str = "我想找一套适合自己的JAVA教程，尽快联系我13500006666" + "交朋友，电话号码是13611125565" + "出售二手电脑，联系方式15899903312";
        // 创建一个Pattern对象，并用它建立一个Matcher对象
        // 该正则表达式只抓取13X和15X段的手机号
        // 实际要抓取哪些电话号码，只要修改正则表达式即可
        Matcher m = Pattern.compile("((13\\d)|(15\\d))\\d{8}").matcher(str);
        // 将所有符合正则表达式的子串（电话号码）全部输出
        while (m.find()) {
            /**
             * m.group(1) 返回135/136/158
             */
            System.out.println("m.group(): " + m.group() + ", m.group(0): " + m.group(0)); // 或者 m.group(0)
        }
        /*
        输出：
        m.group(): 13500006666, m.group(0): 13500006666
        m.group(): 13611125565, m.group(0): 13611125565
        m.group(): 15899903312, m.group(0): 15899903312
         */
    }

    /**
     * 分组匹配
     */
    private static void test2() {
        Pattern pattern = Pattern.compile("(\\d{3,4})\\-(\\d{6,8})");

        pattern.matcher("010-12345678").matches(); // true
        pattern.matcher("021-123456").matches(); // true
        pattern.matcher("022#1234567").matches(); // false

        // 获得Matcher对象:
        Matcher matcher = pattern.matcher("010-12345678");

        /**
         * 使用 matcher.find() 也会返回true，这里执行一次后会置为false,matcher.group()返回的是整个字符串。
         */
        if (matcher.matches()) {
            String whole = matcher.group(0); // "010-12345678", 0表示匹配的整个字符串
            String area = matcher.group(1); // "010", 1表示匹配的第1个子串
            String tel = matcher.group(2); // "12345678", 2表示匹配的第2个子串
            System.out.println("whole:" + whole + ", area:" + area + ", tel:" + tel);
        }
    }

    /**
     * 字符串中连续重复字符串的识别和替换
     */
    private static void test1() {
        Pattern pattern = Pattern.compile("(.)\\1+");
        Matcher matcher = pattern.matcher("11123444546634");
        // sb 缓冲区作为存储替换后的结果
        StringBuffer sb = new StringBuffer();
        // 用正则表达式的find函数去判断，有没有匹配的结果集
        while (matcher.find()) {
            // match.group(0) 是匹配的字符串，比如111234445466中的111
            // match.group(1) 是匹配的字符串的单个字符，比如111234445466中的111中的1
            String repeat = matcher.group(1);
            //appendReplacement用第二个参数去替换匹配成功的子串，并把结果存放在sb中，前面未匹配成功的也会放进去，后面的未匹配成功的不会放进去。例如：11123444546634 最后会替换成(1)23(4)54(6)
            matcher.appendReplacement(sb, "("+repeat+")" );
        }
        //把后面未匹配成功的附加到sb上,例如：11123444546634 最后会替换成(1)23(4)54(6)34
        matcher.appendTail(sb);
        System.out.println(sb.toString());
    }
}
